signer-2017-08-25.min.json 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964
  1. {
  2. "version": "2.0",
  3. "metadata": {
  4. "apiVersion": "2017-08-25",
  5. "endpointPrefix": "signer",
  6. "jsonVersion": "1.1",
  7. "protocol": "rest-json",
  8. "protocols": [
  9. "rest-json"
  10. ],
  11. "serviceAbbreviation": "signer",
  12. "serviceFullName": "AWS Signer",
  13. "serviceId": "signer",
  14. "signatureVersion": "v4",
  15. "signingName": "signer",
  16. "uid": "signer-2017-08-25"
  17. },
  18. "operations": {
  19. "AddProfilePermission": {
  20. "http": {
  21. "requestUri": "/signing-profiles/{profileName}/permissions"
  22. },
  23. "input": {
  24. "type": "structure",
  25. "required": [
  26. "action",
  27. "principal",
  28. "statementId",
  29. "profileName"
  30. ],
  31. "members": {
  32. "profileName": {
  33. "location": "uri",
  34. "locationName": "profileName"
  35. },
  36. "profileVersion": {},
  37. "action": {},
  38. "principal": {},
  39. "revisionId": {},
  40. "statementId": {}
  41. }
  42. },
  43. "output": {
  44. "type": "structure",
  45. "members": {
  46. "revisionId": {}
  47. }
  48. }
  49. },
  50. "CancelSigningProfile": {
  51. "http": {
  52. "method": "DELETE",
  53. "requestUri": "/signing-profiles/{profileName}"
  54. },
  55. "input": {
  56. "type": "structure",
  57. "required": [
  58. "profileName"
  59. ],
  60. "members": {
  61. "profileName": {
  62. "location": "uri",
  63. "locationName": "profileName"
  64. }
  65. }
  66. }
  67. },
  68. "DescribeSigningJob": {
  69. "http": {
  70. "method": "GET",
  71. "requestUri": "/signing-jobs/{jobId}"
  72. },
  73. "input": {
  74. "type": "structure",
  75. "required": [
  76. "jobId"
  77. ],
  78. "members": {
  79. "jobId": {
  80. "location": "uri",
  81. "locationName": "jobId"
  82. }
  83. }
  84. },
  85. "output": {
  86. "type": "structure",
  87. "members": {
  88. "jobId": {},
  89. "source": {
  90. "shape": "Sa"
  91. },
  92. "signingMaterial": {
  93. "shape": "Sf"
  94. },
  95. "platformId": {},
  96. "platformDisplayName": {},
  97. "profileName": {},
  98. "profileVersion": {},
  99. "overrides": {
  100. "shape": "Sj"
  101. },
  102. "signingParameters": {
  103. "shape": "So"
  104. },
  105. "createdAt": {
  106. "type": "timestamp"
  107. },
  108. "completedAt": {
  109. "type": "timestamp"
  110. },
  111. "signatureExpiresAt": {
  112. "type": "timestamp"
  113. },
  114. "requestedBy": {},
  115. "status": {},
  116. "statusReason": {},
  117. "revocationRecord": {
  118. "type": "structure",
  119. "members": {
  120. "reason": {},
  121. "revokedAt": {
  122. "type": "timestamp"
  123. },
  124. "revokedBy": {}
  125. }
  126. },
  127. "signedObject": {
  128. "shape": "Sw"
  129. },
  130. "jobOwner": {},
  131. "jobInvoker": {}
  132. }
  133. }
  134. },
  135. "GetRevocationStatus": {
  136. "http": {
  137. "method": "GET",
  138. "requestUri": "/revocations"
  139. },
  140. "input": {
  141. "type": "structure",
  142. "required": [
  143. "signatureTimestamp",
  144. "platformId",
  145. "profileVersionArn",
  146. "jobArn",
  147. "certificateHashes"
  148. ],
  149. "members": {
  150. "signatureTimestamp": {
  151. "location": "querystring",
  152. "locationName": "signatureTimestamp",
  153. "type": "timestamp"
  154. },
  155. "platformId": {
  156. "location": "querystring",
  157. "locationName": "platformId"
  158. },
  159. "profileVersionArn": {
  160. "location": "querystring",
  161. "locationName": "profileVersionArn"
  162. },
  163. "jobArn": {
  164. "location": "querystring",
  165. "locationName": "jobArn"
  166. },
  167. "certificateHashes": {
  168. "location": "querystring",
  169. "locationName": "certificateHashes",
  170. "type": "list",
  171. "member": {}
  172. }
  173. }
  174. },
  175. "output": {
  176. "type": "structure",
  177. "members": {
  178. "revokedEntities": {
  179. "type": "list",
  180. "member": {}
  181. }
  182. }
  183. },
  184. "endpoint": {
  185. "hostPrefix": "verification."
  186. }
  187. },
  188. "GetSigningPlatform": {
  189. "http": {
  190. "method": "GET",
  191. "requestUri": "/signing-platforms/{platformId}"
  192. },
  193. "input": {
  194. "type": "structure",
  195. "required": [
  196. "platformId"
  197. ],
  198. "members": {
  199. "platformId": {
  200. "location": "uri",
  201. "locationName": "platformId"
  202. }
  203. }
  204. },
  205. "output": {
  206. "type": "structure",
  207. "members": {
  208. "platformId": {},
  209. "displayName": {},
  210. "partner": {},
  211. "target": {},
  212. "category": {},
  213. "signingConfiguration": {
  214. "shape": "S17"
  215. },
  216. "signingImageFormat": {
  217. "shape": "S1c"
  218. },
  219. "maxSizeInMB": {
  220. "type": "integer"
  221. },
  222. "revocationSupported": {
  223. "type": "boolean"
  224. }
  225. }
  226. }
  227. },
  228. "GetSigningProfile": {
  229. "http": {
  230. "method": "GET",
  231. "requestUri": "/signing-profiles/{profileName}"
  232. },
  233. "input": {
  234. "type": "structure",
  235. "required": [
  236. "profileName"
  237. ],
  238. "members": {
  239. "profileName": {
  240. "location": "uri",
  241. "locationName": "profileName"
  242. },
  243. "profileOwner": {
  244. "location": "querystring",
  245. "locationName": "profileOwner"
  246. }
  247. }
  248. },
  249. "output": {
  250. "type": "structure",
  251. "members": {
  252. "profileName": {},
  253. "profileVersion": {},
  254. "profileVersionArn": {},
  255. "revocationRecord": {
  256. "type": "structure",
  257. "members": {
  258. "revocationEffectiveFrom": {
  259. "type": "timestamp"
  260. },
  261. "revokedAt": {
  262. "type": "timestamp"
  263. },
  264. "revokedBy": {}
  265. }
  266. },
  267. "signingMaterial": {
  268. "shape": "Sf"
  269. },
  270. "platformId": {},
  271. "platformDisplayName": {},
  272. "signatureValidityPeriod": {
  273. "shape": "S1j"
  274. },
  275. "overrides": {
  276. "shape": "Sj"
  277. },
  278. "signingParameters": {
  279. "shape": "So"
  280. },
  281. "status": {},
  282. "statusReason": {},
  283. "arn": {},
  284. "tags": {
  285. "shape": "S1o"
  286. }
  287. }
  288. }
  289. },
  290. "ListProfilePermissions": {
  291. "http": {
  292. "method": "GET",
  293. "requestUri": "/signing-profiles/{profileName}/permissions"
  294. },
  295. "input": {
  296. "type": "structure",
  297. "required": [
  298. "profileName"
  299. ],
  300. "members": {
  301. "profileName": {
  302. "location": "uri",
  303. "locationName": "profileName"
  304. },
  305. "nextToken": {
  306. "location": "querystring",
  307. "locationName": "nextToken"
  308. }
  309. }
  310. },
  311. "output": {
  312. "type": "structure",
  313. "members": {
  314. "revisionId": {},
  315. "policySizeBytes": {
  316. "type": "integer"
  317. },
  318. "permissions": {
  319. "type": "list",
  320. "member": {
  321. "type": "structure",
  322. "members": {
  323. "action": {},
  324. "principal": {},
  325. "statementId": {},
  326. "profileVersion": {}
  327. }
  328. }
  329. },
  330. "nextToken": {}
  331. }
  332. }
  333. },
  334. "ListSigningJobs": {
  335. "http": {
  336. "method": "GET",
  337. "requestUri": "/signing-jobs"
  338. },
  339. "input": {
  340. "type": "structure",
  341. "members": {
  342. "status": {
  343. "location": "querystring",
  344. "locationName": "status"
  345. },
  346. "platformId": {
  347. "location": "querystring",
  348. "locationName": "platformId"
  349. },
  350. "requestedBy": {
  351. "location": "querystring",
  352. "locationName": "requestedBy"
  353. },
  354. "maxResults": {
  355. "location": "querystring",
  356. "locationName": "maxResults",
  357. "type": "integer"
  358. },
  359. "nextToken": {
  360. "location": "querystring",
  361. "locationName": "nextToken"
  362. },
  363. "isRevoked": {
  364. "location": "querystring",
  365. "locationName": "isRevoked",
  366. "type": "boolean"
  367. },
  368. "signatureExpiresBefore": {
  369. "location": "querystring",
  370. "locationName": "signatureExpiresBefore",
  371. "type": "timestamp"
  372. },
  373. "signatureExpiresAfter": {
  374. "location": "querystring",
  375. "locationName": "signatureExpiresAfter",
  376. "type": "timestamp"
  377. },
  378. "jobInvoker": {
  379. "location": "querystring",
  380. "locationName": "jobInvoker"
  381. }
  382. }
  383. },
  384. "output": {
  385. "type": "structure",
  386. "members": {
  387. "jobs": {
  388. "type": "list",
  389. "member": {
  390. "type": "structure",
  391. "members": {
  392. "jobId": {},
  393. "source": {
  394. "shape": "Sa"
  395. },
  396. "signedObject": {
  397. "shape": "Sw"
  398. },
  399. "signingMaterial": {
  400. "shape": "Sf"
  401. },
  402. "createdAt": {
  403. "type": "timestamp"
  404. },
  405. "status": {},
  406. "isRevoked": {
  407. "type": "boolean"
  408. },
  409. "profileName": {},
  410. "profileVersion": {},
  411. "platformId": {},
  412. "platformDisplayName": {},
  413. "signatureExpiresAt": {
  414. "type": "timestamp"
  415. },
  416. "jobOwner": {},
  417. "jobInvoker": {}
  418. }
  419. }
  420. },
  421. "nextToken": {}
  422. }
  423. }
  424. },
  425. "ListSigningPlatforms": {
  426. "http": {
  427. "method": "GET",
  428. "requestUri": "/signing-platforms"
  429. },
  430. "input": {
  431. "type": "structure",
  432. "members": {
  433. "category": {
  434. "location": "querystring",
  435. "locationName": "category"
  436. },
  437. "partner": {
  438. "location": "querystring",
  439. "locationName": "partner"
  440. },
  441. "target": {
  442. "location": "querystring",
  443. "locationName": "target"
  444. },
  445. "maxResults": {
  446. "location": "querystring",
  447. "locationName": "maxResults",
  448. "type": "integer"
  449. },
  450. "nextToken": {
  451. "location": "querystring",
  452. "locationName": "nextToken"
  453. }
  454. }
  455. },
  456. "output": {
  457. "type": "structure",
  458. "members": {
  459. "platforms": {
  460. "type": "list",
  461. "member": {
  462. "type": "structure",
  463. "members": {
  464. "platformId": {},
  465. "displayName": {},
  466. "partner": {},
  467. "target": {},
  468. "category": {},
  469. "signingConfiguration": {
  470. "shape": "S17"
  471. },
  472. "signingImageFormat": {
  473. "shape": "S1c"
  474. },
  475. "maxSizeInMB": {
  476. "type": "integer"
  477. },
  478. "revocationSupported": {
  479. "type": "boolean"
  480. }
  481. }
  482. }
  483. },
  484. "nextToken": {}
  485. }
  486. }
  487. },
  488. "ListSigningProfiles": {
  489. "http": {
  490. "method": "GET",
  491. "requestUri": "/signing-profiles"
  492. },
  493. "input": {
  494. "type": "structure",
  495. "members": {
  496. "includeCanceled": {
  497. "location": "querystring",
  498. "locationName": "includeCanceled",
  499. "type": "boolean"
  500. },
  501. "maxResults": {
  502. "location": "querystring",
  503. "locationName": "maxResults",
  504. "type": "integer"
  505. },
  506. "nextToken": {
  507. "location": "querystring",
  508. "locationName": "nextToken"
  509. },
  510. "platformId": {
  511. "location": "querystring",
  512. "locationName": "platformId"
  513. },
  514. "statuses": {
  515. "location": "querystring",
  516. "locationName": "statuses",
  517. "type": "list",
  518. "member": {}
  519. }
  520. }
  521. },
  522. "output": {
  523. "type": "structure",
  524. "members": {
  525. "profiles": {
  526. "type": "list",
  527. "member": {
  528. "type": "structure",
  529. "members": {
  530. "profileName": {},
  531. "profileVersion": {},
  532. "profileVersionArn": {},
  533. "signingMaterial": {
  534. "shape": "Sf"
  535. },
  536. "signatureValidityPeriod": {
  537. "shape": "S1j"
  538. },
  539. "platformId": {},
  540. "platformDisplayName": {},
  541. "signingParameters": {
  542. "shape": "So"
  543. },
  544. "status": {},
  545. "arn": {},
  546. "tags": {
  547. "shape": "S1o"
  548. }
  549. }
  550. }
  551. },
  552. "nextToken": {}
  553. }
  554. }
  555. },
  556. "ListTagsForResource": {
  557. "http": {
  558. "method": "GET",
  559. "requestUri": "/tags/{resourceArn}"
  560. },
  561. "input": {
  562. "type": "structure",
  563. "required": [
  564. "resourceArn"
  565. ],
  566. "members": {
  567. "resourceArn": {
  568. "location": "uri",
  569. "locationName": "resourceArn"
  570. }
  571. }
  572. },
  573. "output": {
  574. "type": "structure",
  575. "members": {
  576. "tags": {
  577. "shape": "S1o"
  578. }
  579. }
  580. }
  581. },
  582. "PutSigningProfile": {
  583. "http": {
  584. "method": "PUT",
  585. "requestUri": "/signing-profiles/{profileName}"
  586. },
  587. "input": {
  588. "type": "structure",
  589. "required": [
  590. "profileName",
  591. "platformId"
  592. ],
  593. "members": {
  594. "profileName": {
  595. "location": "uri",
  596. "locationName": "profileName"
  597. },
  598. "signingMaterial": {
  599. "shape": "Sf"
  600. },
  601. "signatureValidityPeriod": {
  602. "shape": "S1j"
  603. },
  604. "platformId": {},
  605. "overrides": {
  606. "shape": "Sj"
  607. },
  608. "signingParameters": {
  609. "shape": "So"
  610. },
  611. "tags": {
  612. "shape": "S1o"
  613. }
  614. }
  615. },
  616. "output": {
  617. "type": "structure",
  618. "members": {
  619. "arn": {},
  620. "profileVersion": {},
  621. "profileVersionArn": {}
  622. }
  623. }
  624. },
  625. "RemoveProfilePermission": {
  626. "http": {
  627. "method": "DELETE",
  628. "requestUri": "/signing-profiles/{profileName}/permissions/{statementId}"
  629. },
  630. "input": {
  631. "type": "structure",
  632. "required": [
  633. "revisionId",
  634. "profileName",
  635. "statementId"
  636. ],
  637. "members": {
  638. "profileName": {
  639. "location": "uri",
  640. "locationName": "profileName"
  641. },
  642. "revisionId": {
  643. "location": "querystring",
  644. "locationName": "revisionId"
  645. },
  646. "statementId": {
  647. "location": "uri",
  648. "locationName": "statementId"
  649. }
  650. }
  651. },
  652. "output": {
  653. "type": "structure",
  654. "members": {
  655. "revisionId": {}
  656. }
  657. }
  658. },
  659. "RevokeSignature": {
  660. "http": {
  661. "method": "PUT",
  662. "requestUri": "/signing-jobs/{jobId}/revoke"
  663. },
  664. "input": {
  665. "type": "structure",
  666. "required": [
  667. "reason",
  668. "jobId"
  669. ],
  670. "members": {
  671. "jobId": {
  672. "location": "uri",
  673. "locationName": "jobId"
  674. },
  675. "jobOwner": {},
  676. "reason": {}
  677. }
  678. }
  679. },
  680. "RevokeSigningProfile": {
  681. "http": {
  682. "method": "PUT",
  683. "requestUri": "/signing-profiles/{profileName}/revoke"
  684. },
  685. "input": {
  686. "type": "structure",
  687. "required": [
  688. "profileVersion",
  689. "reason",
  690. "effectiveTime",
  691. "profileName"
  692. ],
  693. "members": {
  694. "profileName": {
  695. "location": "uri",
  696. "locationName": "profileName"
  697. },
  698. "profileVersion": {},
  699. "reason": {},
  700. "effectiveTime": {
  701. "type": "timestamp"
  702. }
  703. }
  704. }
  705. },
  706. "SignPayload": {
  707. "http": {
  708. "requestUri": "/signing-jobs/with-payload"
  709. },
  710. "input": {
  711. "type": "structure",
  712. "required": [
  713. "profileName",
  714. "payload",
  715. "payloadFormat"
  716. ],
  717. "members": {
  718. "profileName": {},
  719. "profileOwner": {},
  720. "payload": {
  721. "type": "blob"
  722. },
  723. "payloadFormat": {}
  724. }
  725. },
  726. "output": {
  727. "type": "structure",
  728. "members": {
  729. "jobId": {},
  730. "jobOwner": {},
  731. "metadata": {
  732. "type": "map",
  733. "key": {},
  734. "value": {}
  735. },
  736. "signature": {
  737. "type": "blob"
  738. }
  739. }
  740. }
  741. },
  742. "StartSigningJob": {
  743. "http": {
  744. "requestUri": "/signing-jobs"
  745. },
  746. "input": {
  747. "type": "structure",
  748. "required": [
  749. "source",
  750. "destination",
  751. "profileName",
  752. "clientRequestToken"
  753. ],
  754. "members": {
  755. "source": {
  756. "shape": "Sa"
  757. },
  758. "destination": {
  759. "type": "structure",
  760. "members": {
  761. "s3": {
  762. "type": "structure",
  763. "members": {
  764. "bucketName": {},
  765. "prefix": {}
  766. }
  767. }
  768. }
  769. },
  770. "profileName": {},
  771. "clientRequestToken": {
  772. "idempotencyToken": true
  773. },
  774. "profileOwner": {}
  775. }
  776. },
  777. "output": {
  778. "type": "structure",
  779. "members": {
  780. "jobId": {},
  781. "jobOwner": {}
  782. }
  783. }
  784. },
  785. "TagResource": {
  786. "http": {
  787. "requestUri": "/tags/{resourceArn}"
  788. },
  789. "input": {
  790. "type": "structure",
  791. "required": [
  792. "resourceArn",
  793. "tags"
  794. ],
  795. "members": {
  796. "resourceArn": {
  797. "location": "uri",
  798. "locationName": "resourceArn"
  799. },
  800. "tags": {
  801. "shape": "S1o"
  802. }
  803. }
  804. },
  805. "output": {
  806. "type": "structure",
  807. "members": {}
  808. }
  809. },
  810. "UntagResource": {
  811. "http": {
  812. "method": "DELETE",
  813. "requestUri": "/tags/{resourceArn}"
  814. },
  815. "input": {
  816. "type": "structure",
  817. "required": [
  818. "resourceArn",
  819. "tagKeys"
  820. ],
  821. "members": {
  822. "resourceArn": {
  823. "location": "uri",
  824. "locationName": "resourceArn"
  825. },
  826. "tagKeys": {
  827. "location": "querystring",
  828. "locationName": "tagKeys",
  829. "type": "list",
  830. "member": {}
  831. }
  832. }
  833. },
  834. "output": {
  835. "type": "structure",
  836. "members": {}
  837. }
  838. }
  839. },
  840. "shapes": {
  841. "Sa": {
  842. "type": "structure",
  843. "members": {
  844. "s3": {
  845. "type": "structure",
  846. "required": [
  847. "bucketName",
  848. "key",
  849. "version"
  850. ],
  851. "members": {
  852. "bucketName": {},
  853. "key": {},
  854. "version": {}
  855. }
  856. }
  857. }
  858. },
  859. "Sf": {
  860. "type": "structure",
  861. "required": [
  862. "certificateArn"
  863. ],
  864. "members": {
  865. "certificateArn": {}
  866. }
  867. },
  868. "Sj": {
  869. "type": "structure",
  870. "members": {
  871. "signingConfiguration": {
  872. "type": "structure",
  873. "members": {
  874. "encryptionAlgorithm": {},
  875. "hashAlgorithm": {}
  876. }
  877. },
  878. "signingImageFormat": {}
  879. }
  880. },
  881. "So": {
  882. "type": "map",
  883. "key": {},
  884. "value": {}
  885. },
  886. "Sw": {
  887. "type": "structure",
  888. "members": {
  889. "s3": {
  890. "type": "structure",
  891. "members": {
  892. "bucketName": {},
  893. "key": {}
  894. }
  895. }
  896. }
  897. },
  898. "S17": {
  899. "type": "structure",
  900. "required": [
  901. "encryptionAlgorithmOptions",
  902. "hashAlgorithmOptions"
  903. ],
  904. "members": {
  905. "encryptionAlgorithmOptions": {
  906. "type": "structure",
  907. "required": [
  908. "allowedValues",
  909. "defaultValue"
  910. ],
  911. "members": {
  912. "allowedValues": {
  913. "type": "list",
  914. "member": {}
  915. },
  916. "defaultValue": {}
  917. }
  918. },
  919. "hashAlgorithmOptions": {
  920. "type": "structure",
  921. "required": [
  922. "allowedValues",
  923. "defaultValue"
  924. ],
  925. "members": {
  926. "allowedValues": {
  927. "type": "list",
  928. "member": {}
  929. },
  930. "defaultValue": {}
  931. }
  932. }
  933. }
  934. },
  935. "S1c": {
  936. "type": "structure",
  937. "required": [
  938. "supportedFormats",
  939. "defaultFormat"
  940. ],
  941. "members": {
  942. "supportedFormats": {
  943. "type": "list",
  944. "member": {}
  945. },
  946. "defaultFormat": {}
  947. }
  948. },
  949. "S1j": {
  950. "type": "structure",
  951. "members": {
  952. "value": {
  953. "type": "integer"
  954. },
  955. "type": {}
  956. }
  957. },
  958. "S1o": {
  959. "type": "map",
  960. "key": {},
  961. "value": {}
  962. }
  963. }
  964. }